package com.jgy.utils;

import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author 姜光远
 * @date 2023/3/23 15:27
 */
public class TimeUtil {



    /**
     * 合并多个时间段，返回可用时间段
     *
     * @param segments 原始时间段列表
     * @return 可用时间段列表
     */
    public static List<TimeSegment> mergeTimeSegments(List<TimeSegment> segments) {
        // 对时间段按照开始时间排序
        Comparator<TimeSegment> byStart = Comparator.comparing(TimeSegment::getStart);
        List<TimeSegment> sortedSegments = segments.stream().sorted(byStart).collect(Collectors.toList());

        TimeSegment merged = sortedSegments.isEmpty() ? null : sortedSegments.get(0);
        List<TimeSegment> result = new ArrayList<>();
        // 将时间段进行合并
        for (int i = 1; i < sortedSegments.size(); i++) {
            TimeSegment current = sortedSegments.get(i);
            // 如果没有重叠，直接添加
            if (current.getStart().isAfter(merged.getEnd())) {
                result.add(merged);
                merged = current;
            } else if (current.getEnd().isAfter(merged.getEnd())) {
                // 如果有重叠，更新结束时间
                merged.setEnd(current.getEnd());
            }
        }
        if (merged != null) {
            result.add(merged);
        }
        return result;
    }





        /**正常版本
         *    将时间段按照开始时间排序
         */
    //segments.sort(Comparator.comparing(TimeSegment::getStart));
    //
    //    // 合并时间段
    //    List<TimeSegment> mergedSegments = new ArrayList<>();
    //    TimeSegment current = segments.get(0);
    //    int size = segments.size();
    //    for(int i = 1; i < size; i++) {
    //        TimeSegment next = segments.get(i);
    //        if (current.getEnd().isBefore(next.getStart())) {
    //            mergedSegments.add(current);
    //            current = next;
    //        } else {
    //            LocalDateTime maxEnd = current.getEnd().isAfter(next.getEnd()) ? current.getEnd() : next.getEnd();
    //            current = new TimeSegment(current.getStart(), maxEnd);
    //        }
    //    }
    //    mergedSegments.add(current);
    //
    //    return mergedSegments;
    //}



}

/**
 * 时间段类
 */
class TimeSegment {
    private LocalDateTime start;
    private LocalDateTime end;

    public TimeSegment(LocalDateTime start, LocalDateTime end) {
        this.start = start;
        this.end = end;
    }

    public LocalDateTime getStart() {
        return start;
    }

    public void setStart(LocalDateTime start) {
        this.start = start;
    }

    public LocalDateTime getEnd() {
        return end;
    }

    public void setEnd(LocalDateTime end) {
        this.end = end;
    }

    /**
     * 输出时间段的字符串表示
     *
     * @return 时间段的字符串表示
     */
    @Override
    public String toString() {
        return start + " - " + end;
    }
}